package com.qf.kdxf.service.impl;

import com.qf.kdxf.service.TextIdentifyService;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 明廷盛
 * @Date 2025/6/11 15:14
 * @Description
 */

// 声明这是一个Spring服务组件
@Service
public class TextIdentifyServiceImpl implements TextIdentifyService {

    /**
     * 构造调用讯飞OCR API所需的请求头信息
     * @param language 识别语言类型
     *        - "cn"：中文
     *        - "en"：英文
     * @param location 是否返回文字位置信息
     *        - "true"：返回坐标
     *        - "false"：不返回坐标
     * @return 包含完整认证信息的请求头Map
     */
    @Override
    public Map<String, String> constructHeader(String language, String location) {
        // 1. 生成当前时间戳（秒级）
        // 讯飞API要求的时间戳格式：Unix时间戳(10位秒数)
        String X_CurTime = String.valueOf(System.currentTimeMillis() / 1000L);

        // 2. 构造请求参数JSON
        // 格式示例：{"language":"en","location":"false"}
        String param = "{\"language\":\"" + language + "\"" + ",\"location\":\"" + location + "\"}";

        // 3. 对参数进行Base64编码
        String X_Param = null;
        try {
            X_Param = new String(Base64.encodeBase64(param.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
            // UTF-8编码不支持异常（理论上不会发生）
            e.printStackTrace();
        }

        // 4. 准备API认证信息
        String apiKey = "bc06c93c580eb8a91242f7d1ea2ed1f7"; // 讯飞API密钥（示例值，实际应配置在安全位置）
        String X_Appid = "ced63297";                      // 讯飞应用ID

        // 5. 生成请求签名
        // 签名算法：MD5(apiKey + curTime + param)
        String X_CheckSum = DigestUtils.md5Hex(apiKey + X_CurTime + X_Param);

        // 6. 构造最终请求头
        Map<String, String> header = new HashMap();
        // 6.1 设置内容类型
        header.put("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        // 6.2 设置Base64编码后的参数
        header.put("X-Param", X_Param);
        // 6.3 设置请求时间戳
        header.put("X-CurTime", X_CurTime);
        // 6.4 设置请求签名
        header.put("X-CheckSum", X_CheckSum);
        // 6.5 设置应用ID
        header.put("X-Appid", X_Appid);

        return header;
    }
}

